import akka.actor.{Actor, ActorRef, ActorSystem, Props}

/**
 * case类似于Java中的dto
 * 文件名和class和object名可以不一样，但是规范最好保持一致
 * 1、怎么创建actor
 * 2、怎么发送初始消息
 * 3、怎么回应消息
 */


/**
 * 开始消息，case class可用于模式匹配
 *
 * @param msg
 */
case class StartMessage(msg: String)

/**
 * 结束消息
 *
 * @param msg
 */
case class StopMessage(msg: String)

/**
 * Acator发送的消息
 *
 * @param msg
 */
case class AMessage(msg: String)

/**
 * Bactor发送的消息
 *
 * @param msg
 */
case class BMessage(msg: String)

/**
 * 相互通信
 */
object ChatActor {

  def main(args: Array[String]): Unit = {
    // 创建actor俩个
    val system = ActorSystem("ABsystem")
    val a = system.actorOf(Props[AActor], "A")
    val b = system.actorOf(Props(new BActor(a)), "B")
    // 向Bactor发送开始消息，调用用 ！为什么？
    b ! StartMessage("乔峰：在下乔峰！请赐教！")
  }

  /**
   * Aactor
   */
  class AActor extends Actor {
    var count = 0 //信息发送次数
    def receive = {
      // a收到b的普通消息
      case BMessage(msg) => {
        count += 1
        println("BActor" + msg)
        sender ! AMessage(s"(黄飞鸿)：厉害，看我佛山无影脚...第 $count 脚") //A回复B
      }
      // a收到b的开始消息
      case StartMessage(msg) => {
        count += 1
        println("AActor" + msg)
        sender ! AMessage(s"(黄飞鸿)：看我佛山无影脚...第 $count 脚")
      }
      // a收到b的结束消息
      case StopMessage(msg) =>
        println(s"BActor乔峰：$msg")
        context.stop(self)
    }
  }

  /**
   * Bactor的构建参数是Aactor
   *
   * @param a
   */
  class BActor(a: ActorRef) extends Actor {
    var count = 0 //信息发送次数

    def receive = {
      // b收到a的普通消息
      case AMessage(msg) =>
        //当通信次数大于9次时，就停掉,实际上是通信满10次就停止
        if (count > 9) {
          //回复StopMessage
          sender ! StopMessage("点到为止！！！")
          //将系统整个地停掉
          context.stop(self)
        } else {
          count += 1
          println("AActor" + msg)
          //回复，继续发送消息, B回复A
          sender ! BMessage(s"（乔峰）：挺猛，看我降龙十八掌...第 $count 掌")
        }
      // b收到开始消息
      case StartMessage(msg) =>
        println("BActor" + msg)
        // 向a发送开始消息
        a ! StartMessage("黄飞鸿：在下黄飞鸿！看招！！！")
    }
  }

}